﻿2026-05-17T23:59:59.8879482Z ##[group]Run pnpm verify:phase-5
2026-05-17T23:59:59.8880022Z [36;1mpnpm verify:phase-5[0m
2026-05-17T23:59:59.8928270Z shell: /usr/bin/bash -e {0}
2026-05-17T23:59:59.8928865Z env:
2026-05-17T23:59:59.8929199Z   SKIP_STAGING_VERIFY: false
2026-05-17T23:59:59.8929626Z   SKIP_PHASE_4_CARRYOVER: 
2026-05-17T23:59:59.8930029Z   SKIP_STAGING_SMOKE: false
2026-05-17T23:59:59.8930518Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-17T23:59:59.8931072Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-17T23:59:59.8931481Z   SKIP_TRACE_CHECK: 1
2026-05-17T23:59:59.8931841Z ##[endgroup]
2026-05-18T00:00:00.4238877Z 
2026-05-18T00:00:00.4249468Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-18T00:00:00.4266877Z > node scripts/verify-phase-5.mjs
2026-05-18T00:00:00.4267391Z 
2026-05-18T00:00:00.4688883Z 
2026-05-18T00:00:00.4700494Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-18T00:00:00.4701469Z >>> pnpm verify:phase-4
2026-05-18T00:00:00.8878947Z 
2026-05-18T00:00:00.8903016Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-18T00:00:00.8907900Z > node scripts/verify-phase-4.mjs
2026-05-18T00:00:00.8927751Z 
2026-05-18T00:00:00.9329175Z 
2026-05-18T00:00:00.9330081Z === Workspace: typecheck ===
2026-05-18T00:00:00.9349211Z >>> pnpm -r typecheck
2026-05-18T00:00:01.3429610Z Scope: 5 of 6 workspace projects
2026-05-18T00:00:01.3539888Z packages/db typecheck$ tsc --noEmit
2026-05-18T00:00:01.3540936Z packages/game-logic typecheck$ tsc --noEmit
2026-05-18T00:00:04.3819773Z packages/game-logic typecheck: Done
2026-05-18T00:00:04.3821284Z packages/protocol typecheck$ tsc --noEmit
2026-05-18T00:00:05.9297851Z packages/db typecheck: Done
2026-05-18T00:00:07.6254490Z packages/protocol typecheck: Done
2026-05-18T00:00:07.6261733Z apps/client typecheck$ tsc --noEmit
2026-05-18T00:00:07.6264678Z apps/server typecheck$ tsc --noEmit
2026-05-18T00:00:19.7234306Z apps/client typecheck: Done
2026-05-18T00:00:20.3303991Z apps/server typecheck: Done
2026-05-18T00:00:20.3411423Z 
2026-05-18T00:00:20.3412157Z === Lint: protocol-sync ===
2026-05-18T00:00:20.3412864Z >>> pnpm lint:protocol-sync
2026-05-18T00:00:20.6420890Z 
2026-05-18T00:00:20.6422036Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-18T00:00:20.6423000Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-18T00:00:20.6423481Z 
2026-05-18T00:00:20.6729622Z lint-protocol-sync: OK
2026-05-18T00:00:20.6855131Z 
2026-05-18T00:00:20.6855846Z === Lint: game-logic-purity ===
2026-05-18T00:00:20.6856552Z >>> pnpm lint:game-logic-purity
2026-05-18T00:00:20.9778606Z 
2026-05-18T00:00:20.9779505Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-18T00:00:20.9782385Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-18T00:00:20.9782803Z 
2026-05-18T00:00:21.0099983Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-18T00:00:21.0221219Z 
2026-05-18T00:00:21.0223383Z === Lint: better-auth-schema-sync ===
2026-05-18T00:00:21.0224289Z >>> pnpm lint:better-auth-schema-sync
2026-05-18T00:00:21.3090421Z 
2026-05-18T00:00:21.3091557Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-18T00:00:21.3094461Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-18T00:00:21.3094908Z 
2026-05-18T00:00:22.9083265Z lint-better-auth-schema-sync: OK
2026-05-18T00:00:22.9211903Z 
2026-05-18T00:00:22.9212620Z === Lint: rate-limit-budgets ===
2026-05-18T00:00:22.9213399Z >>> pnpm lint:rate-limit-budgets
2026-05-18T00:00:23.2076104Z 
2026-05-18T00:00:23.2077314Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-18T00:00:23.2078690Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-18T00:00:23.2079366Z 
2026-05-18T00:00:23.2402007Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-18T00:00:23.2524085Z 
2026-05-18T00:00:23.2524741Z === Lint: no-clipboard-rce ===
2026-05-18T00:00:23.2525505Z >>> pnpm lint:no-clipboard-rce
2026-05-18T00:00:23.5412724Z 
2026-05-18T00:00:23.5413966Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-18T00:00:23.5416014Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-18T00:00:23.5416977Z 
2026-05-18T00:00:23.5780313Z lint-no-clipboard-rce: OK (23 file(s) clean)
2026-05-18T00:00:23.5910182Z 
2026-05-18T00:00:23.5910863Z === Lint: room-layout ===
2026-05-18T00:00:23.5911648Z >>> pnpm lint:room-layout
2026-05-18T00:00:23.8804149Z 
2026-05-18T00:00:23.8805396Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-18T00:00:23.8806556Z > node tools/scripts/lint-room-layout.mjs
2026-05-18T00:00:23.8807131Z 
2026-05-18T00:00:23.9187869Z lint-room-layout: OK
2026-05-18T00:00:23.9314949Z 
2026-05-18T00:00:23.9315663Z === ADR 0004 lint ===
2026-05-18T00:00:23.9316473Z >>> pnpm lint:adr:0004
2026-05-18T00:00:24.2189448Z 
2026-05-18T00:00:24.2190588Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-18T00:00:24.2191950Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-18T00:00:24.2192838Z 
2026-05-18T00:00:24.2492750Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-18T00:00:24.2614491Z 
2026-05-18T00:00:24.2615145Z === Drizzle: emit-check ===
2026-05-18T00:00:24.2616080Z >>> pnpm db:emit-check
2026-05-18T00:00:24.5529226Z 
2026-05-18T00:00:24.5530346Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-18T00:00:24.5533267Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-18T00:00:24.5535394Z 
2026-05-18T00:00:25.0116066Z No config path provided, using default 'drizzle.config.ts'
2026-05-18T00:00:25.0118046Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-18T00:00:25.4557625Z 8 tables
2026-05-18T00:00:25.4558204Z accounts 8 columns 1 indexes 0 fks
2026-05-18T00:00:25.4559023Z audit_log 6 columns 0 indexes 2 fks
2026-05-18T00:00:25.4559588Z characters 9 columns 0 indexes 1 fks
2026-05-18T00:00:25.4560203Z inventory_items 4 columns 0 indexes 1 fks
2026-05-18T00:00:25.4560842Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-18T00:00:25.4561522Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-18T00:00:25.4562143Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-18T00:00:25.4562712Z sessions 5 columns 0 indexes 1 fks
2026-05-18T00:00:25.4562998Z 
2026-05-18T00:00:25.4563588Z No schema changes, nothing to migrate 😴
2026-05-18T00:00:26.1636886Z 
2026-05-18T00:00:26.1637792Z === Drizzle: schema-sync ===
2026-05-18T00:00:26.1638916Z >>> pnpm lint:schema-sync
2026-05-18T00:00:26.4537798Z 
2026-05-18T00:00:26.4538829Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-18T00:00:26.4541923Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-18T00:00:26.4544176Z 
2026-05-18T00:00:26.4819496Z OK
2026-05-18T00:00:26.4952340Z 
2026-05-18T00:00:26.4952862Z === Drizzle: source-comments ===
2026-05-18T00:00:26.4953411Z >>> pnpm lint:source-comments
2026-05-18T00:00:26.7799954Z 
2026-05-18T00:00:26.7801139Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-18T00:00:26.7802298Z > pnpm -C packages/db run lint:source-comments
2026-05-18T00:00:26.7802970Z 
2026-05-18T00:00:27.0742365Z 
2026-05-18T00:00:27.0743740Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-18T00:00:27.0744975Z > node scripts/check-source-comments.mjs
2026-05-18T00:00:27.0745615Z 
2026-05-18T00:00:27.1064725Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-18T00:00:27.1292056Z 
2026-05-18T00:00:27.1292968Z === Workspace: test ===
2026-05-18T00:00:27.1294469Z >>> pnpm -r test
2026-05-18T00:00:27.4283561Z Scope: 5 of 6 workspace projects
2026-05-18T00:00:27.4335147Z packages/db test$ vitest run
2026-05-18T00:00:27.4343515Z packages/game-logic test$ vitest run
2026-05-18T00:00:27.9200816Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-18T00:00:27.9280046Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-18T00:00:28.3971229Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-18T00:00:28.6595536Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:00:28.8805642Z packages/game-logic test:  [32m✓[39m test/edge-parity.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:28.8887302Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-18T00:00:29.1183864Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:00:29.1378616Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:29.3243047Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:29.5663118Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:00:29.7621648Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:29.8943232Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-18T00:00:29.9241252Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-18T00:00:29.9260529Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-18T00:00:29.9395507Z packages/db test: [2m   Start at [22m 00:00:27
2026-05-18T00:00:29.9397610Z packages/db test: [2m   Duration [22m 1.97s[2m (transform 162ms, setup 0ms, import 1.35s, tests 29ms, environment 0ms)[22m
2026-05-18T00:00:29.9399553Z packages/db test: Done
2026-05-18T00:00:29.9400310Z packages/protocol test$ vitest run
2026-05-18T00:00:30.0023514Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:30.2421975Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:00:30.4720343Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-18T00:00:30.4740325Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-18T00:00:30.7072080Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-18T00:00:30.9031888Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-18T00:00:30.9396867Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:31.1725524Z packages/game-logic test:  [32m✓[39m test/step-pass-through.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:31.2149510Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-18T00:00:31.3791830Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:31.3794920Z packages/game-logic test: [2m Test Files [22m [1m[32m14 passed[39m[22m[90m (14)[39m
2026-05-18T00:00:31.3801415Z packages/game-logic test: [2m      Tests [22m [1m[32m75 passed[39m[22m[90m (75)[39m
2026-05-18T00:00:31.3802891Z packages/game-logic test: [2m   Start at [22m 00:00:27
2026-05-18T00:00:31.3805225Z packages/game-logic test: [2m   Duration [22m 3.44s[2m (transform 329ms, setup 0ms, import 612ms, tests 123ms, environment 2ms)[22m
2026-05-18T00:00:31.4268614Z packages/game-logic test: Done
2026-05-18T00:00:31.4555570Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:31.5969745Z packages/protocol test:  [32m✓[39m test/anim-state.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:31.7447350Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:31.7483693Z packages/protocol test: [2m Test Files [22m [1m[32m5 passed[39m[22m[90m (5)[39m
2026-05-18T00:00:31.7504790Z packages/protocol test: [2m      Tests [22m [1m[32m59 passed[39m[22m[90m (59)[39m
2026-05-18T00:00:31.7505994Z packages/protocol test: [2m   Start at [22m 00:00:30
2026-05-18T00:00:31.7507685Z packages/protocol test: [2m   Duration [22m 1.29s[2m (transform 192ms, setup 0ms, import 375ms, tests 55ms, environment 1ms)[22m
2026-05-18T00:00:31.7843335Z packages/protocol test: Done
2026-05-18T00:00:31.7847427Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-18T00:00:31.7850466Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-18T00:00:32.2878618Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-18T00:00:32.3702308Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-18T00:00:33.4510001Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 54[2mms[22m[39m
2026-05-18T00:00:33.8591356Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-18T00:00:33.8753430Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 111[2mms[22m[39m
2026-05-18T00:00:34.1405942Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-18T00:00:34.4313055Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-18T00:00:34.6941724Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-18T00:00:34.9731360Z apps/server test: {"level":40,"time":1779062434966,"pid":3327,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:00:34.9790338Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:00:34.9840320Z apps/server test: {"level":40,"time":1779062434970,"pid":3327,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:00:34.9897657Z apps/server test: {"level":40,"time":1779062434970,"pid":3327,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:00:35.6633246Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-18T00:00:35.6660417Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-18T00:00:35.7773667Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 300[2mms[22m[39m
2026-05-18T00:00:35.8680754Z apps/server test: {"level":30,"time":1779062435866,"pid":3338,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-18T00:00:35.8745891Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 685[2mms[22m[39m
2026-05-18T00:00:35.8755094Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 582[2mms[22m[39m
2026-05-18T00:00:36.3088057Z apps/server test: {"level":40,"time":1779062436306,"pid":3362,"hostname":"runnervmrw5os","msg_type":"position_update","sessionId":"sid-1","issue":"[\n  {\n    \"code\": \"unrecognized_keys\",\n    \"keys\": [\n      \"account_id\"\n    ],\n    \"path\": [],\n    \"message\": \"Unrecognized key(s) in object: 'account_id'\"\n  }\n]","msg":"invalid_intent"}
2026-05-18T00:00:36.3160894Z apps/server test: {"level":40,"time":1779062436308,"pid":3362,"hostname":"runnervmrw5os","msg_type":"position_update","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-18T00:00:36.3195828Z apps/server test:  [32m✓[39m test/position-update.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-18T00:00:37.0267345Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 96[2mms[22m[39m
2026-05-18T00:00:37.2340516Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:00:37.2342615Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-TSrzV6/rebno.db
2026-05-18T00:00:37.2344030Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:00:37.3401478Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:00:37.3404362Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:00:37.3450505Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:00:37.3454191Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:00:37.3475331Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:00:37.3485831Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:00:37.3487813Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:00:37.3493813Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-18T00:00:37.3497534Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:00:37.3499766Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:00:37.3500539Z apps/server test: }
2026-05-18T00:00:37.3502554Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:00:37.3504400Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:00:37.3624955Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:00:37.3627951Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-B6aCB3/rebno.db
2026-05-18T00:00:37.3639730Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:00:37.3649636Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-18T00:00:37.3683308Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:00:37.3693070Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:00:37.3701257Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:00:37.3703775Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:00:37.3705970Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:00:37.3708133Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:00:37.3711071Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:00:37.3714019Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-18T00:00:37.3716483Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:00:37.3718547Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:00:37.3719425Z apps/server test: }
2026-05-18T00:00:37.3721559Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:00:37.3723449Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:00:37.3760424Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3765297Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LSOQUg/rebno.db
2026-05-18T00:00:37.3770367Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:00:37.3820360Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3822521Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:00:37.3850528Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:00:37.3852878Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:00:37.3854918Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:00:37.3856682Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:00:37.3859022Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:00:37.3860641Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-18T00:00:37.3862806Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:00:37.3864304Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:00:37.3864857Z apps/server test: }
2026-05-18T00:00:37.3866571Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3868060Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:00:37.3873360Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3875304Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LSOQUg/rebno.db
2026-05-18T00:00:37.3876631Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:00:37.3879162Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3880674Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:00:37.3882473Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:00:37.3884432Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:00:37.3886741Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:00:37.3890160Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:00:37.3892180Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:00:37.3894082Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:00:37.3895712Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:00:37.3897322Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-18T00:00:37.3899729Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:00:37.3901257Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:00:37.3902033Z apps/server test: }
2026-05-18T00:00:37.3955796Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 187[2mms[22m[39m
2026-05-18T00:00:37.6916955Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-18T00:00:37.8835974Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:00:38.1428695Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 60[2mms[22m[39m
2026-05-18T00:00:38.1449815Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-18T00:00:38.5295364Z apps/server test: {"level":40,"time":1779062438517,"pid":3440,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","sessionId":"sid-1","issue":"[\n  {\n    \"received\": \"admin_form\",\n    \"code\": \"invalid_enum_value\",\n    \"options\": [\n      \"hexport_in\",\n      \"hexport_out\",\n      \"tele_in\",\n      \"tele_out\",\n      \"ncol_1\",\n      \"ncol_2\",\n      \"ncol_3\",\n      \"ncol_4\",\n      \"jokershell\",\n      \"watching\",\n      \"none\"\n    ],\n    \"path\": [\n      \"sprite_id\"\n    ],\n    \"message\": \"Invalid enum value. Expected 'hexport_in' | 'hexport_out' | 'tele_in' | 'tele_out' | 'ncol_1' | 'ncol_2' | 'ncol_3' | 'ncol_4' | 'jokershell' | 'watching' | 'none', received 'admin_form'\"\n  }\n]","msg":"invalid_intent"}
2026-05-18T00:00:38.5310382Z apps/server test: {"level":40,"time":1779062438519,"pid":3440,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-18T00:00:38.5670582Z apps/server test:  [32m✓[39m test/sprite-override.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:00:38.7730748Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:39.4180704Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-18T00:00:39.5298293Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-18T00:00:39.5355760Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-18T00:00:39.5362411Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-18T00:00:40.2304946Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:40.5277430Z apps/server test:  [32m✓[39m test/protocol-monotonic-int.unit.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:40.5297053Z apps/server test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-18T00:00:40.5691352Z apps/server test: [2m      Tests [22m [1m[32m89 passed[39m[22m[90m (89)[39m
2026-05-18T00:00:40.5785050Z apps/server test: [2m   Start at [22m 00:00:32
2026-05-18T00:00:40.5792184Z apps/server test: [2m   Duration [22m 8.22s[2m (transform 602ms, setup 0ms, import 3.81s, tests 1.22s, environment 2ms)[22m
2026-05-18T00:00:40.5862616Z apps/server test: Done
2026-05-18T00:00:40.5978645Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 148[2mms[22m[39m
2026-05-18T00:00:41.2670148Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:00:41.9518136Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-18T00:00:42.7654705Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-18T00:00:43.5082318Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 87[2mms[22m[39m
2026-05-18T00:00:44.1855357Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-18T00:00:44.8642592Z apps/client test:  [32m✓[39m src/__test__/player-renderer-stale-anim.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:00:45.5515341Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:00:46.2410199Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-18T00:00:46.9475380Z apps/client test:  [32m✓[39m src/__test__/position-dispatcher.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:00:47.6415399Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-18T00:00:48.3629749Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-18T00:00:48.3633260Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-18T00:00:48.3641583Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 76[2mms[22m[39m
2026-05-18T00:00:49.0332670Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:49.7472163Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-18T00:00:50.4281748Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:51.0851455Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:51.7920438Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:52.4657597Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:00:53.1347688Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:00:53.8001401Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:54.4582578Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:00:55.1207811Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:55.7804368Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:00:56.5291354Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:57.1803788Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:00:57.8400623Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-18T00:00:58.4941468Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:00:59.1566496Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:00:59.8262405Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:00.5018818Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:00.5256243Z apps/client test: [2m Test Files [22m [1m[32m35 passed[39m[22m[90m (35)[39m
2026-05-18T00:01:00.5277040Z apps/client test: [2m      Tests [22m [1m[32m255 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (259)[39m
2026-05-18T00:01:00.5280155Z apps/client test: [2m   Start at [22m 00:00:32
2026-05-18T00:01:00.5297274Z apps/client test: [2m   Duration [22m 28.15s[2m (transform 1.05s, setup 72ms, collect 2.09s, tests 1.18s, environment 16.33s, prepare 3.01s)[22m
2026-05-18T00:01:00.6650435Z apps/client test: Done
2026-05-18T00:01:00.6741255Z 
2026-05-18T00:01:00.6742216Z verify-phase-4: OK (12 steps green)
2026-05-18T00:01:00.6865797Z 
2026-05-18T00:01:00.6866501Z === Workspace: typecheck ===
2026-05-18T00:01:00.6869431Z >>> pnpm -r typecheck
2026-05-18T00:01:00.9816338Z Scope: 5 of 6 workspace projects
2026-05-18T00:01:00.9864583Z packages/db typecheck$ tsc --noEmit
2026-05-18T00:01:00.9872661Z packages/game-logic typecheck$ tsc --noEmit
2026-05-18T00:01:03.5159774Z packages/game-logic typecheck: Done
2026-05-18T00:01:03.5179353Z packages/protocol typecheck$ tsc --noEmit
2026-05-18T00:01:05.6570158Z packages/db typecheck: Done
2026-05-18T00:01:07.0322337Z packages/protocol typecheck: Done
2026-05-18T00:01:07.0329643Z apps/client typecheck$ tsc --noEmit
2026-05-18T00:01:07.0332337Z apps/server typecheck$ tsc --noEmit
2026-05-18T00:01:19.8116275Z apps/client typecheck: Done
2026-05-18T00:01:20.2032136Z apps/server typecheck: Done
2026-05-18T00:01:20.2133758Z 
2026-05-18T00:01:20.2134588Z === Lint: deploy-stack ===
2026-05-18T00:01:20.2135384Z >>> pnpm lint:deploy-stack
2026-05-18T00:01:20.5178078Z 
2026-05-18T00:01:20.5179470Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-18T00:01:20.5180610Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-18T00:01:20.5181221Z 
2026-05-18T00:01:20.5567637Z lint-deploy-stack: OK
2026-05-18T00:01:20.5712947Z 
2026-05-18T00:01:20.5713857Z === Lint: deploy-stack test ===
2026-05-18T00:01:20.5714726Z >>> pnpm lint:deploy-stack:test
2026-05-18T00:01:20.8687881Z 
2026-05-18T00:01:20.8689282Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-18T00:01:20.8690676Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-18T00:01:20.8691299Z 
2026-05-18T00:01:20.9366408Z PASS: lint-deploy-stack green
2026-05-18T00:01:20.9506889Z 
2026-05-18T00:01:20.9507691Z === ADR 0005 lint ===
2026-05-18T00:01:20.9508699Z >>> pnpm lint:adr:0005
2026-05-18T00:01:21.2431841Z 
2026-05-18T00:01:21.2432974Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-18T00:01:21.2434432Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-18T00:01:21.2435517Z 
2026-05-18T00:01:21.2767107Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-18T00:01:21.2899023Z 
2026-05-18T00:01:21.2899660Z === ADR 0006 lint ===
2026-05-18T00:01:21.2900142Z >>> pnpm lint:adr:0006
2026-05-18T00:01:21.5847471Z 
2026-05-18T00:01:21.5848861Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-18T00:01:21.5850382Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-18T00:01:21.5851383Z 
2026-05-18T00:01:21.6160088Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-18T00:01:21.6292508Z 
2026-05-18T00:01:21.6293235Z === Workspace: test ===
2026-05-18T00:01:21.6293849Z >>> pnpm -r test
2026-05-18T00:01:21.9280372Z Scope: 5 of 6 workspace projects
2026-05-18T00:01:21.9332509Z packages/db test$ vitest run
2026-05-18T00:01:21.9340156Z packages/game-logic test$ vitest run
2026-05-18T00:01:22.4180809Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-18T00:01:22.4361172Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-18T00:01:22.8650661Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-18T00:01:23.0953781Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:01:23.3267544Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:01:23.3535336Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-18T00:01:23.5465120Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:23.7660943Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:01:23.9755518Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:24.2010850Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:01:24.2034465Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:24.4205244Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:24.4320140Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-18T00:01:24.4359932Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-18T00:01:24.4369697Z packages/db test: [2m   Start at [22m 00:01:22
2026-05-18T00:01:24.4392836Z packages/db test: [2m   Duration [22m 2.00s[2m (transform 145ms, setup 0ms, import 1.37s, tests 28ms, environment 0ms)[22m
2026-05-18T00:01:24.4394992Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:24.4679370Z packages/db test: Done
2026-05-18T00:01:24.4699305Z packages/protocol test$ vitest run
2026-05-18T00:01:24.6811103Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:24.9194580Z packages/game-logic test:  [32m✓[39m test/edge-parity.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:24.9850899Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-18T00:01:25.1491005Z packages/game-logic test:  [32m✓[39m test/step-pass-through.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:25.4060690Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-18T00:01:25.4269155Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-18T00:01:25.6577519Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:25.7130856Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-18T00:01:25.8798687Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:25.8846401Z packages/game-logic test: [2m Test Files [22m [1m[32m14 passed[39m[22m[90m (14)[39m
2026-05-18T00:01:25.8859275Z packages/game-logic test: [2m      Tests [22m [1m[32m75 passed[39m[22m[90m (75)[39m
2026-05-18T00:01:25.8876747Z packages/game-logic test: [2m   Start at [22m 00:01:22
2026-05-18T00:01:25.8887212Z packages/game-logic test: [2m   Duration [22m 3.44s[2m (transform 289ms, setup 0ms, import 570ms, tests 126ms, environment 2ms)[22m
2026-05-18T00:01:25.9286932Z packages/game-logic test: Done
2026-05-18T00:01:25.9408031Z packages/protocol test:  [32m✓[39m test/anim-state.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:26.1099338Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:26.2588823Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:26.2617940Z packages/protocol test: [2m Test Files [22m [1m[32m5 passed[39m[22m[90m (5)[39m
2026-05-18T00:01:26.2623841Z packages/protocol test: [2m      Tests [22m [1m[32m59 passed[39m[22m[90m (59)[39m
2026-05-18T00:01:26.2629181Z packages/protocol test: [2m   Start at [22m 00:01:24
2026-05-18T00:01:26.2640086Z packages/protocol test: [2m   Duration [22m 1.27s[2m (transform 183ms, setup 0ms, import 348ms, tests 56ms, environment 1ms)[22m
2026-05-18T00:01:26.2981892Z packages/protocol test: Done
2026-05-18T00:01:26.2988216Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-18T00:01:26.2990913Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-18T00:01:26.8236415Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-18T00:01:26.8845968Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-18T00:01:27.8440883Z apps/server test: {"level":30,"time":1779062487838,"pid":4638,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-18T00:01:27.8460041Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 730[2mms[22m[39m
2026-05-18T00:01:27.8499776Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 602[2mms[22m[39m
2026-05-18T00:01:28.9037873Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-18T00:01:28.9053086Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-18T00:01:28.9936414Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:01:28.9954437Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-rNF3LT/rebno.db
2026-05-18T00:01:28.9955912Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:01:29.0013764Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 261[2mms[22m[39m
2026-05-18T00:01:29.1061586Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:01:29.1082918Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:01:29.1096750Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:01:29.1120251Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:01:29.1140966Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:01:29.1162744Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:01:29.1175455Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:01:29.1177815Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-18T00:01:29.1197133Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:01:29.1199915Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:01:29.1200675Z apps/server test: }
2026-05-18T00:01:29.1230469Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-18T00:01:29.1233116Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:01:29.1236906Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:01:29.1263180Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-eOxzQ2/rebno.db
2026-05-18T00:01:29.1275143Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:01:29.1277570Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-18T00:01:29.1282086Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:01:29.1321376Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:01:29.1341314Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:01:29.1352950Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:01:29.1355545Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:01:29.1360524Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:01:29.1384367Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:01:29.1413075Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-18T00:01:29.1427786Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:01:29.1429997Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:01:29.1430737Z apps/server test: }
2026-05-18T00:01:29.1433187Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-18T00:01:29.1436075Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:01:29.1439326Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1459613Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-NpTNRO/rebno.db
2026-05-18T00:01:29.1476177Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:01:29.1513199Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1516131Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:01:29.1528104Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:01:29.1530798Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:01:29.1532683Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:01:29.1534667Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:01:29.1536409Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:01:29.1538109Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-18T00:01:29.1540524Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:01:29.1542106Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:01:29.1542778Z apps/server test: }
2026-05-18T00:01:29.1544546Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1546588Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-18T00:01:29.1549155Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-18T00:01:29.1551538Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-18T00:01:29.1553656Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-18T00:01:29.1555664Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-18T00:01:29.1557466Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-18T00:01:29.1559424Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-18T00:01:29.1561862Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-18T00:01:29.1563604Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-18T00:01:29.1564297Z apps/server test: }
2026-05-18T00:01:29.1566069Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1567798Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:01:29.1570141Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1572141Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-NpTNRO/rebno.db
2026-05-18T00:01:29.1573557Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-18T00:01:29.1575696Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-18T00:01:29.1577177Z apps/server test: [22m[39m[run-migrations] OK
2026-05-18T00:01:29.1579052Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 175[2mms[22m[39m
2026-05-18T00:01:29.5550911Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 130[2mms[22m[39m
2026-05-18T00:01:30.3015556Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 166[2mms[22m[39m
2026-05-18T00:01:30.5325209Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 62[2mms[22m[39m
2026-05-18T00:01:30.9499702Z apps/server test: {"level":40,"time":1779062490945,"pid":4740,"hostname":"runnervmrw5os","msg_type":"position_update","sessionId":"sid-1","issue":"[\n  {\n    \"code\": \"unrecognized_keys\",\n    \"keys\": [\n      \"account_id\"\n    ],\n    \"path\": [],\n    \"message\": \"Unrecognized key(s) in object: 'account_id'\"\n  }\n]","msg":"invalid_intent"}
2026-05-18T00:01:30.9530843Z apps/server test: {"level":40,"time":1779062490946,"pid":4740,"hostname":"runnervmrw5os","msg_type":"position_update","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-18T00:01:30.9585781Z apps/server test:  [32m✓[39m test/position-update.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-18T00:01:31.2382021Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-18T00:01:31.5162382Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 101[2mms[22m[39m
2026-05-18T00:01:31.5313213Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:01:31.8050721Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-18T00:01:32.0860522Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-18T00:01:32.4354459Z apps/server test: {"level":40,"time":1779062492428,"pid":4804,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","sessionId":"sid-1","issue":"[\n  {\n    \"received\": \"admin_form\",\n    \"code\": \"invalid_enum_value\",\n    \"options\": [\n      \"hexport_in\",\n      \"hexport_out\",\n      \"tele_in\",\n      \"tele_out\",\n      \"ncol_1\",\n      \"ncol_2\",\n      \"ncol_3\",\n      \"ncol_4\",\n      \"jokershell\",\n      \"watching\",\n      \"none\"\n    ],\n    \"path\": [\n      \"sprite_id\"\n    ],\n    \"message\": \"Invalid enum value. Expected 'hexport_in' | 'hexport_out' | 'tele_in' | 'tele_out' | 'ncol_1' | 'ncol_2' | 'ncol_3' | 'ncol_4' | 'jokershell' | 'watching' | 'none', received 'admin_form'\"\n  }\n]","msg":"invalid_intent"}
2026-05-18T00:01:32.4390202Z apps/server test:  [32m✓[39m test/sprite-override.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-18T00:01:32.4400168Z apps/server test: {"level":40,"time":1779062492430,"pid":4804,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-18T00:01:32.7204621Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 138[2mms[22m[39m
2026-05-18T00:01:32.7300377Z apps/server test: {"level":40,"time":1779062492727,"pid":4815,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:01:32.7381044Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:01:32.7389764Z apps/server test: {"level":40,"time":1779062492730,"pid":4815,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:01:32.7409070Z apps/server test: {"level":40,"time":1779062492731,"pid":4815,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-18T00:01:32.9655599Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-18T00:01:33.1815233Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:33.8780092Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-18T00:01:33.8807894Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-18T00:01:33.8829560Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-18T00:01:34.0058843Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-18T00:01:34.0065515Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-18T00:01:34.0111741Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 129[2mms[22m[39m
2026-05-18T00:01:34.6424073Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:34.9450301Z apps/server test:  [32m✓[39m test/protocol-monotonic-int.unit.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:35.1090839Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 105[2mms[22m[39m
2026-05-18T00:01:35.1712747Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:35.1809810Z apps/server test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-18T00:01:35.1839617Z apps/server test: [2m      Tests [22m [1m[32m89 passed[39m[22m[90m (89)[39m
2026-05-18T00:01:35.1863874Z apps/server test: [2m   Start at [22m 00:01:26
2026-05-18T00:01:35.1865600Z apps/server test: [2m   Duration [22m 8.34s[2m (transform 560ms, setup 0ms, import 3.75s, tests 1.27s, environment 2ms)[22m
2026-05-18T00:01:35.2555030Z apps/server test: Done
2026-05-18T00:01:35.9627578Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-18T00:01:36.6721273Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 41[2mms[22m[39m
2026-05-18T00:01:37.3929248Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-18T00:01:38.0958941Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-18T00:01:38.7784116Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-18T00:01:39.4966083Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-18T00:01:40.1793370Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-18T00:01:40.8304764Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:01:41.5159790Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-18T00:01:42.1963810Z apps/client test:  [32m✓[39m src/__test__/player-renderer-stale-anim.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-18T00:01:42.8823798Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-18T00:01:43.5515338Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:01:44.2391352Z apps/client test:  [32m✓[39m src/__test__/position-dispatcher.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:01:44.8921338Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-18T00:01:45.5378106Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:46.2248917Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-18T00:01:46.9026792Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-18T00:01:47.6453884Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:48.3320337Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-18T00:01:48.9835757Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:49.6687786Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:50.3538180Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:51.0404215Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-18T00:01:51.7235335Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:52.4077383Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:53.0785910Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:53.7532175Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:54.4195968Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-18T00:01:55.0873287Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-18T00:01:55.1090272Z apps/client test: [2m Test Files [22m [1m[32m35 passed[39m[22m[90m (35)[39m
2026-05-18T00:01:55.1105231Z apps/client test: [2m      Tests [22m [1m[32m255 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (259)[39m
2026-05-18T00:01:55.1106526Z apps/client test: [2m   Start at [22m 00:01:26
2026-05-18T00:01:55.1108184Z apps/client test: [2m   Duration [22m 28.22s[2m (transform 973ms, setup 72ms, collect 1.93s, tests 1.27s, environment 16.41s, prepare 2.95s)[22m
2026-05-18T00:01:55.2407177Z apps/client test: Done
2026-05-18T00:01:55.2491972Z 
2026-05-18T00:01:55.2492678Z verify-phase-5: OK (7 steps green)
